package com.smart.community.user.util;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;

/**
 * 缓存工具类
 * 
 * 用于安全地处理缓存反序列化问题，避免ClassCastException
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-08-28
 */
@Slf4j
public class CacheUtil {
    
    private static final ObjectMapper objectMapper = new ObjectMapper();
    
    /**
     * 安全地转换缓存对象
     * 
     * @param cachedObject 缓存对象
     * @param targetClass 目标类型
     * @param <T> 泛型类型
     * @return 转换后的对象，失败返回null
     */
    public static <T> T safeConvert(Object cachedObject, Class<T> targetClass) {
        try {
            if (cachedObject == null) {
                return null;
            }
            
            // 如果已经是目标类型，直接返回
            if (targetClass.isInstance(cachedObject)) {
                return targetClass.cast(cachedObject);
            }
            
            // 如果是Map类型，说明Redis反序列化时出现了问题
            if (cachedObject instanceof java.util.Map) {
                log.warn("缓存数据为Map格式，无法转换为{}类型", targetClass.getSimpleName());
                return null;
            }
            
            // 尝试通过JSON转换
            String jsonString = objectMapper.writeValueAsString(cachedObject);
            return objectMapper.readValue(jsonString, targetClass);
            
        } catch (Exception e) {
            log.warn("缓存对象转换失败，目标类型：{}，错误：{}", targetClass.getSimpleName(), e.getMessage());
            return null;
        }
    }
    
    /**
     * 检查缓存对象是否有效
     * 
     * @param cachedObject 缓存对象
     * @param targetClass 目标类型
     * @return 是否有效
     */
    public static boolean isValidCache(Object cachedObject, Class<?> targetClass) {
        if (cachedObject == null) {
            return false;
        }
        
        // 检查类型是否匹配
        if (!targetClass.isInstance(cachedObject)) {
            log.warn("缓存对象类型不匹配，期望：{}，实际：{}", 
                    targetClass.getSimpleName(), cachedObject.getClass().getSimpleName());
            return false;
        }
        
        return true;
    }
}
